# 导入 threading 模块，该模块提供了多线程编程的功能，允许程序并发执行多个任务
import threading
# 导入 time 模块，该模块提供了与时间相关的函数，可用于实现延时等操作
import time

# 创建一个Event对象，用于在线程间进行通信，控制线程的执行与停止
stop_event = threading.Event()

def worker(thread_id):
    """
    线程执行的核心函数，每个线程都会运行此函数
    :param thread_id: 线程的唯一标识符，用于区分不同的线程
    """
    # 进入一个循环，只要 stop_event 未被设置（即内部标志为 False），线程就会持续运行
    while not stop_event.is_set():
        # 打印当前正在工作的线程的 ID，告知用户该线程正在运行
        print(f"Thread {thread_id} is working...")
        # 让线程休眠 1 秒，模拟线程在执行实际的工作任务
        time.sleep(1)
    # 当 stop_event 被设置（内部标志为 True）时，打印线程停止的信息
    print(f"Thread {thread_id} stopped.")

# 创建一个空列表，用于存储后续创建的所有线程对象，方便后续管理和操作
threads = []

# 使用 for 循环创建 5 个线程
for i in range(5):
    # 创建一个新的线程对象，指定线程要执行的函数为 worker，并将线程 ID 作为参数传递给该函数
    thread = threading.Thread(target=worker, args=(i,))
    # 启动线程，让线程开始执行 worker 函数
    thread.start()
    # 将创建好并启动的线程对象添加到 threads 列表中，方便后续管理
    threads.append(thread)

# 主线程休眠 5 秒，模拟主线程在执行其他任务
time.sleep(5)
# 设置 stop_event 的内部标志为 True，通知所有正在运行的线程停止执行
stop_event.set()

# 遍历 threads 列表中的所有线程对象
for thread in threads:
    # 调用线程的 join 方法，主线程会阻塞在此处，直到该线程执行完毕
    thread.join()

# 当所有线程都执行完毕后，打印提示信息，表示所有线程都已停止运行
print("All threads stopped.")